#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <string>
#include <cstring>
#include <cstdio>
using namespace std;
//创建NUM个进程对数据进行处理 每个进程处理自己的数据 最后再汇总到一起
#define NUM 10
class ThreadData
{
public:
  ThreadData()
  {
  }
  void Init(const string &name, int a, int b)
  {
    _name = name;
    _a = a;
    _b = b;
  }
  string getname(){return _name;}
  int A(){return _a;}
  int B(){return _b;}
  pthread_t gettid() { return _tid; }
  void settid(pthread_t tid)
  {
    _tid = tid;
  }
  void sum()
  {
    _sum = _a + _b;
  }
  int getsum() { return _sum; }
  ~ThreadData()
  {
  }

private:
  pthread_t _tid;
  string _name;
  int _a;
  int _b;
  int _sum;
};
void * routine(void * args)
{
  ThreadData *td = static_cast<ThreadData*>(args);
  while(true)
  {
    cout<<"我是新线程,我的名字是: "<<td->getname()<<"我的tid是  "<<td->gettid()<<endl;
    td->sum();
    sleep(1);
    break;
  }
  return td;
}
int main()
{
  // pthread_create()
  ThreadData td[NUM];
  //准备数据
  for(int i=0;i<NUM;i++)
  {
    char buff[64];
    snprintf(buff,sizeof(buff),"thread-%d",i);
    td[i].Init(buff,i*10,i*20);
  }
  //创建多线程
  for(int i=0;i<NUM;i++)
  {
    pthread_t tid;
    pthread_create(&tid,nullptr,routine,&td[i]);
    td[i].settid(tid);
  }
  //等待多个线程
  for(int i=0;i<NUM;i++)
  {
    pthread_join(td[i].gettid(),nullptr);
    cout<<"join success : 线程名称是: "<<td[i].getname()<<"线程id是: "<<td[i].gettid()<<endl;
  }
  //汇总结果
  for(int i=0;i<NUM;i++)
  {
    printf("td[%d]: %d+%d=%d : %ld\n",i,td[i].A(),td[i].B(),td[i].getsum(),td[i].gettid());
  }
  return 0;
}

// 新线程
// void *down(void *args)
// {

//     while(true)
//     {
//         std::cout << "new thread, pid: " << getpid() << std::endl;
//         sleep(5);
//         break;
//     }
//    //return (void*)10;
//    pthread_exit((void*)20);
// }

// int main()
// {
//     std::cout << "我是一个进程: " << getpid() << std::endl;
//     pthread_t tid;
//     pthread_create(&tid, nullptr, down, (void*)"thread-1");
//     void * ret = nullptr;
//     int n= pthread_join(tid,&ret);
//     if(n==0)
//       printf("join success , pthread_id :%ld, ret :%lld\n",tid,(long long int)ret);//void *指针是8个字节 64位下
//     // 主线程
//     while(true)
//     {
//         std::cout << "main thread, pid: "<< getpid() << std::endl;
//         sleep(1);
//     }

//     return 0;
// }
